/*
███████╗██╗   ██╗ ██████╗██╗  ██╗
██╔════╝██║   ██║██╔════╝██║ ██╔╝
█████╗  ██║   ██║██║     █████╔╝ 
██╔══╝  ██║   ██║██║     ██╔═██╗ 
██║     ╚██████╔╝╚██████╗██║  ██╗
╚═╝      ╚═════╝  ╚═════╝╚═╝  ╚═╝
*/
package common.utils;


import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

public class DBUtilsV2 {
    private static String driver;
    private static String url;
    private static String user;
    private static String password;

    static {
        Properties properties = new Properties();
        try {
            // 使用 ClassLoader 从 resources 文件夹加载配置文件
            InputStream inputStream = DBUtilsV2.class.getClassLoader().getResourceAsStream("jdbc.properties");
            if(inputStream == null) {
                // 抛出一个更明确的异常
                throw new RuntimeException("Fatal Error: Could not find jdbc.properties in classpath!");
            }
            properties.load(inputStream);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            user = properties.getProperty("username");
            password = properties.getProperty("password");
            inputStream.close();

            // 顺便在这里加载一下驱动，更符合逻辑
            Class.forName(driver);

        } catch (Exception e) {
            e.printStackTrace();
            // 如果初始化失败，直接让程序崩溃，防止后续出现更多莫名其妙的错误
            throw new RuntimeException("Fatal Error: Failed to initialize DBUtilsV2", e);
        }
    }

    // 获取连接的方法
    public static Connection open() {
        try {
            // 每次调用open，都返回一个新的连接
            return DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
            // 如果获取连接失败，返回null或者抛出异常
            return null;
        }
    }

    // 关闭连接的方法，注意要传入需要关闭的连接对象
    public static void close(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 我们甚至可以加上关闭 Statement 和 ResultSet 的方法，让它更完整！
    // public static void close(Statement stmt, Connection conn) { ... }
    // public static void close(ResultSet rs, Statement stmt, Connection conn) { ... }
}
